package com.wuwei.tran.service.impl;

import com.wuwei.tran.domain.MyFile;
import com.wuwei.tran.service.FileService;
import com.wuwei.tran.utils.FileSearcher;
import com.wuwei.tran.utils.FileUtils;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileTime;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.stream.Stream;

@Service
public class FileServiceImpl implements FileService {

    @Value("${ROOT_PATH}")
    private String filePath;


    @SneakyThrows
    @Override
    public List<MyFile> getList(String name,String route) {
        route = "/"+route;
        Path path = Paths.get(this.filePath+route);
        List<MyFile> list = new ArrayList<>();
        Stream<Path> paths = Files.list(path);
        paths.sorted(Comparator
                .comparing((Path p) -> Files.isDirectory(p) ? 1 : 0) // 首先按是否是目录排序，目录排在后面，后面再翻转一次，就完成了排序
                .thenComparing(p -> {
                    try {
                        return Files.getLastModifiedTime(p); // 然后按最后修改时间排序
                    } catch (IOException e) {
                        e.printStackTrace();
                        return FileTime.fromMillis(0);  // 出错时返回最早的时间（例如，1970年1月1日）
                    }
                }).reversed())
                .forEach(p->{
                    Path fileName = p.getFileName();
                    MyFile myFile = new MyFile();
                    //设置文件名
                    myFile.setName(String.valueOf(fileName));
                    //设置文件路径
                    myFile.setPath(p.toAbsolutePath().toString());
                    if (!Files.isDirectory(p)) {
                        //如果是文件，则获取其文件大小，该方法如果是文件夹会报错
                        try {
                            //设置文件大小
                            String size = String.valueOf(Files.size(p));
                            Long iSize = Long.valueOf(size);
                            myFile.setLength(String.valueOf(iSize/1024)+"KB");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    try {
                        //获取上次修改日期
                        FileTime fileTime = Files.getLastModifiedTime(p);
                        String formattedDateTime = getDateFormatted(fileTime);
                        //设置上次修改日期
                        myFile.setLastTime(formattedDateTime);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    //获取文件图标
                    try {
                        String iconBase64 = FileUtils.getFileIconBase64(p);
                        myFile.setIcon(iconBase64);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    list.add(myFile);
                });
        return list;
    }

    private String getDateFormatted(FileTime fileTime) {
        // 将 FileTime 转换为 LocalDateTime
        Instant instant = fileTime.toInstant();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
        // 格式化为更友好的日期时间字符串
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return localDateTime.format(formatter);
    }

    /**
     * 在根目录下搜索文件
     * @param name
     * @return
     */
    @Override
    public List<MyFile> searchFile(String name) {
        FileSearcher fileSearcher = new FileSearcher();
        List<File> files = fileSearcher.searchFiles(this.filePath, name);
        List<MyFile> fileList = new ArrayList<>();
        files.forEach(f->{
            MyFile myFile = new MyFile();
            myFile.setName(f.getName());
            myFile.setPath(f.getAbsolutePath().toString());
            //设置文件大小
            long lSize = f.length();
            String length;
            if (lSize!= 0L&&!f.isDirectory()) {
                length = String.valueOf(lSize/1024);
                myFile.setLength(length+"KB");
            } else {
                myFile.setLength(null);
            }
            Date date = new Date(f.lastModified());
            // 定义所需的日期时间格式
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            myFile.setLastTime(sdf.format(date));
            try {
                String fileIconBase64 = FileUtils.getFileIconBase64(f);
                myFile.setIcon(fileIconBase64);
            } catch (IOException e) {
                e.printStackTrace();
            }
            fileList.add(myFile);
        });
        return fileList;
    }
}
